package cn.nawang.ebeim.server.task;

import java.io.IOException;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.nawang.ebeim.server.constants.Config;
import cn.nawang.ebeim.server.constants.Constant;
import cn.nawang.ebeim.server.entity.StorageCloud;
import cn.nawang.ebeim.server.entity.StorageFileToDoView;
import cn.nawang.ebeim.server.util.ApiVisitUtil;
import cn.nawang.ebeim.server.util.TransportUtil;

/**
 * @ClassName: HandleFileTodoTask
 * @Description: TODO
 * @author xuwy
 * @date 2015年8月27日 下午2:46:58
 * @version v1.0
 */
public class HandleFileTodoTask implements IOTask {
  private static final Logger LOG = LoggerFactory.getLogger(HandleFileTodoTask.class);

  private List<StorageFileToDoView> list;

  public HandleFileTodoTask(List<StorageFileToDoView> list) {
    this.list = list;
  }

  /**
   * 执行任务
   */
  public void execute() {
    try {
      for (StorageFileToDoView obj : list) {
        StorageCloud storageCloud = ApiVisitUtil.getStorageCloudByName(Config.STORAGE_CLOUD_NAME);
        String isExist = ApiVisitUtil.isExistStorageFileToDo(storageCloud.getId(),
            obj.getDatasourceId(), obj.getSignature());
        String isExistTbStorageStrategy=ApiVisitUtil.isExistTbStorageStrategy(storageCloud.getId());
        // 1.本机对应的storageCloudId是否是客户想要迁移的
        // 2.判断备份数是否达到最大了
        // 3.是否在处理中
        // 4.本机对应的storageCloud是否已经有了备份
        if (isExistTbStorageStrategy.equals(Constant.NO_EXIST)
            ||obj.getCopyCount() == obj.getMaxCopys()
            || obj.getStatus() == Constant.STORAGE_FILE_STATUS_ONE
            || isExist.equals(Constant.EXIST)) {
          continue;
        }
        // 将数据文件从已有的云存储迁移到本地上传目录
        dataTransferToStorageCloud(obj);
      }
    } catch (Exception ex) {
      throw new RuntimeException("execute 异常:{}",ex);
    }
  }



  /**
   * 将数据文件从已有的云存储迁移到本地上传目录
   * 
   * @throws IOException
   */
  public void dataTransferToStorageCloud(StorageFileToDoView obj) throws IOException {
    String datasourceId = obj.getDatasourceId();
    String signature = obj.getSignature();

    // 把状态置为处理中
    obj.setStatus(Constant.STORAGE_FILE_STATUS_ONE);
    ApiVisitUtil.updataStorageFileToDo(obj);

    // 从已有存储的存储云(obj.getStorageCloudId1肯定有存的)下载到本地
    // 从本地上传到云存储,让下载的路径为客户端上传时的路径，根据扫描自动完成
    TransportUtil.downloadDataFile(datasourceId, signature, obj.getStorageCloudId1());

    
  }

}
